package msg

import (
	"encoding/binary"
	"sync/atomic"
)

type Msg struct {
	Length uint64
	SeqNo  uint64
	Data   []byte
}

var seqNoCount atomic.Uint64

func NewMsg(data []byte) *Msg {
	return &Msg{
		Length: 8 + uint64(len(data)),
		SeqNo:  seqNoCount.Add(1),
		Data:   data,
	}
}

func (msg *Msg) MsgTotalLength() uint64 {
	return msg.Length + 8
}

func (msg *Msg) Encode() []byte {
	b := make([]byte, msg.Length+8)
	binary.BigEndian.PutUint64(b[:8], msg.Length)
	binary.BigEndian.PutUint64(b[8:16], msg.SeqNo)
	copy(b[16:], msg.Data)
	return b
}

type Packet struct {
	Header uint64
	Batch  *[]byte
}

func NewPacket(data *[]byte) *Packet {
	return &Packet{
		Header: uint64(len(*data)),
		Batch:  data,
	}
}

func (p *Packet) Encode() []byte {
	b := make([]byte, p.Header+8)
	binary.BigEndian.PutUint64(b[:8], p.Header)
	copy(b[8:], *p.Batch)
	return b
}
